{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 天河gmx测试\n",
    "\n",
    "* 软件：gromacs5.0.6-cpu\n",
    "* 软件目录：/vol6/software/gromacs5.0\n",
    "* 对象：liganded gp120\n",
    "* 文件目录:/vol6/home/shuqunliu/gerry/gp120\n",
    "\n",
    "## 详细命令及输出\n",
    "### generate the gromacs file\n",
    "```\n",
    "gmx_mpi pdb2gmx -f bound.pdb -o bound.gro -ff gromos53a6 -water spce -ignh -p topol.top\n",
    "\n",
    "Before cleaning: 6712 pairs\n",
    "Before cleaning: 7877 dihedrals\n",
    "Making cmap torsions...\n",
    "There are 2182 dihedrals, 2029 impropers, 5996 angles\n",
    "          6712 pairs,     4096 bonds and     0 virtual sites\n",
    "Total mass 44707.968 a.m.u.\n",
    "Total charge -0.000 e\n",
    "```\n",
    "### define the box\n",
    "```\n",
    "gmx_mpi editconf -f bound.gro -o bound_newbox.gro -c -d 1.5 -bt dodecahedron\n",
    "\n",
    "Read 4018 atoms\n",
    "Volume: 407.985 nm^3, corresponds to roughly 183500 electrons\n",
    "No velocities found\n",
    "    system size :  6.165  6.225 10.854 (nm)\n",
    "    diameter    : 11.177               (nm)\n",
    "    center      :  3.173  4.373 12.521 (nm)\n",
    "    box vectors :  6.055  6.210 10.849 (nm)\n",
    "    box angles  :  90.00  90.00  90.00 (degrees)\n",
    "    box volume  : 407.98               (nm^3)\n",
    "    shift       :  7.460  6.260 -7.509 (nm)\n",
    "new center      : 10.633 10.633  5.012 (nm)\n",
    "new box vectors : 14.177 14.177 14.177 (nm)\n",
    "new box angles  :  60.00  60.00  90.00 (degrees)\n",
    "new box volume  :2014.86               (nm^3)\n",
    "```\n",
    "\n",
    "### add solvate\n",
    "```\n",
    "gmx_mpi solvate -cp bound_newbox.gro -cs spc216.gro -o bound_solv.gro -p topol.top\n",
    "\n",
    "Output configuration contains 199273 atoms in 65486 residues\n",
    "Volume                 :     2014.86 (nm^3)\n",
    "Density                :     1003.89 (g/l)\n",
    "Number of SOL molecules:  65085\n",
    "```\n",
    "### yhi \n",
    "* 提交作业前 请查看可用（idle）节点数\n",
    "* n 核数 N 节点数 一般只用指定核数 n:N = 12:1\n",
    "\n",
    "```\n",
    "yhi\n",
    "---\n",
    "TH_NET1      up 2-00:00:00     22   idle cn[2456,3001,3242,3519,3532,3539,3572,3574-3575,3581,4002,4028,4064,4092,4103,4140,4157,4352,4364,4412,5599,5623]\n",
    "```\n",
    "### energy minimization of the structure in solvate\n",
    "```\n",
    "\n",
    "Setting the LD random seed to 1818397286\n",
    "Generated 165 of the 1596 non-bonded parameter combinations\n",
    "Excluding 3 bonded neighbours molecule type 'Protein'\n",
    "Excluding 2 bonded neighbours molecule type 'SOL'\n",
    "Removing all charge groups because cutoff-scheme=Verlet\n",
    "Analysing residue names:\n",
    "There are:   401    Protein residues\n",
    "There are: 65085      Water residues\n",
    "Analysing Protein...\n",
    "Number of degrees of freedom in T-Coupling group rest is 402561.00\n",
    "Calculating fourier grid dimensions for X Y Z\n",
    "Using a fourier grid of 120x120x120, spacing 0.118 0.118 0.118\n",
    "Estimate for the relative computational load of the PME mesh part: 0.22\n",
    "This run will generate roughly 15 Mb of data\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 24 -p TH_NET1 gmx_mpi mdrun -v -deffnm em\n",
    "\n",
    "Steepest Descents converged to Fmax < 1000 in 913 steps\n",
    "Potential Energy  = -3.5350252e+06\n",
    "Maximum force     =  9.5109045e+02 on atom 3780\n",
    "Norm of force     =  1.7909399e+01\n",
    "```\n",
    "### nvt\n",
    "```\n",
    "gmx_mpi grompp -f nvt.mdp -c em.gro -p topol.top -o nvt.tpr\n",
    "\n",
    "Setting the LD random seed to 1138260440\n",
    "Generated 165 of the 1596 non-bonded parameter combinations\n",
    "Excluding 3 bonded neighbours molecule type 'Protein'\n",
    "turning all bonds into constraints...\n",
    "Excluding 2 bonded neighbours molecule type 'SOL'\n",
    "turning all bonds into constraints...\n",
    "Setting gen_seed to 1244599708\n",
    "Velocities were taken from a Maxwell distribution at 300 K\n",
    "Removing all charge groups because cutoff-scheme=Verlet\n",
    "Analysing residue names:\n",
    "There are:   401    Protein residues\n",
    "There are: 65085      Water residues\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 20 -p TH_NET1 gmx_mpi mdrun -v -deffnm nvt\n",
    "\n",
    "starting mdrun 'Protein in water'\n",
    "50000 steps,    100.0 ps.\n",
    " Average load imbalance: 0.7 %\n",
    " Part of the total run time spent waiting due to load imbalance: 0.6 %\n",
    " Steps where the load balancing was limited by -rdd, -rcon and/or -dds: X 0 % Y 0 %\n",
    " Average PME mesh/force load: 0.724\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 4.5 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:    31838.559     1597.270     1993.3\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:        5.409        4.437\n",
    "```\n",
    "### npt\n",
    "```\n",
    "gmx_mpi grompp -f npt.mdp -c nvt.gro -t nvt.cpt -p topol.top -o npt.tpr\n",
    "\n",
    "Number of degrees of freedom in T-Coupling group Protein is 7957.94\n",
    "Number of degrees of freedom in T-Coupling group non-Protein is 390507.06\n",
    "Determining Verlet buffer for a tolerance of 0.005 kJ/mol/ps at 300 K\n",
    "Calculated rlist for 1x1 atom pair-list as 1.036 nm, buffer size 0.036 nm\n",
    "Set rlist, assuming 4x4 atom pair-list, to 1.000 nm, buffer size 0.000 nm\n",
    "Note that mdrun will redetermine rlist based on the actual pair-list setup\n",
    "Reading Coordinates, Velocities and Box size from old trajectory\n",
    "Will read whole trajectory\n",
    "Last frame         -1 time  100.000\n",
    "Using frame at t = 100 ps\n",
    "Starting time for run is 0 ps\n",
    "Calculating fourier grid dimensions for X Y Z\n",
    "Using a fourier grid of 96x96x96, spacing 0.148 0.148 0.148\n",
    "Estimate for the relative computational load of the PME mesh part: 0.18\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 20 -p TH_NET1 gmx_mpi mdrun -v -deffnm npt\n",
    "\n",
    " Average load imbalance: 1.8 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.4 %\n",
    " Average PME mesh/force load: 0.716\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 4.8 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:    31356.646     1571.530     1995.3\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:        5.498        4.365\n",
    "```\n",
    "### md\n",
    "```\n",
    "gmx_mpi grompp -f md.mdp -c npt.gro -t npt.cpt -p topol.top -o md.tpr\n",
    "\n",
    "There are:   401    Protein residues\n",
    "There are: 65085      Water residues\n",
    "Analysing Protein...\n",
    "Number of degrees of freedom in T-Coupling group Protein is 7957.94\n",
    "Number of degrees of freedom in T-Coupling group non-Protein is 390507.06\n",
    "Determining Verlet buffer for a tolerance of 0.005 kJ/mol/ps at 300 K\n",
    "Calculated rlist for 1x1 atom pair-list as 1.036 nm, buffer size 0.036 nm\n",
    "Set rlist, assuming 4x4 atom pair-list, to 1.000 nm, buffer size 0.000 nm\n",
    "Note that mdrun will redetermine rlist based on the actual pair-list setup\n",
    "Reading Coordinates, Velocities and Box size from old trajectory\n",
    "Will read whole trajectory\n",
    "Last frame         -1 time  100.000\n",
    "Using frame at t = 100 ps\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 20 -p TH_NET1 gmx_mpi mdrun -v -deffnm md\n",
    "\n",
    " Average load imbalance: 2.5 %\n",
    " Part of the total run time spent waiting due to load imbalance: 2.0 %\n",
    " Average PME mesh/force load: 0.703\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 5.0 %\n",
    "\n",
    "NOTE: 5.0 % performance was lost because the PME ranks\n",
    "      had less work to do than the PP ranks.\n",
    "      You might want to decrease the number of PME ranks\n",
    "      or decrease the cut-off and the grid spacing.\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   320032.311    16049.602     1994.0\n",
    "                         4h27:29\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:        5.383        4.458\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 40 -p TH_NET1 gmx_mpi mdrun -v -deffnm md\n",
    "\n",
    "step 500000, remaining wall clock time:     0 s\n",
    "\n",
    " Average load imbalance: 2.8 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.7 %\n",
    " Average PME mesh/force load: 0.742\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 4.3 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   416760.820    10432.048     3995.0\n",
    "                         2h53:52\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:        8.282        2.898\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 60 -p TH_NET1 /vol6/software/gromacs506_cpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 3.7 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.8 %\n",
    " Average PME mesh/force load: 0.915\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 1.2 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   498798.224     8320.419     5994.9\n",
    "                         2h18:40\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       10.384        2.311\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 80 -p TH_NET1 /vol6/software/gromacs506_cpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 1.8 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.1 %\n",
    " Steps where the load balancing was limited by -rdd, -rcon and/or -dds: X 0 % Y 0 % Z 0 %\n",
    " Average PME mesh/force load: 0.983\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 0.2 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   417439.726     5222.002     7993.9\n",
    "                         1h27:02\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       16.545        1.451\n",
    "\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 100 -p TH_NET1 /vol6/software/gromacs506_cpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 4.5 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.8 %\n",
    " Average PME mesh/force load: 0.484\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 8.9 %\n",
    "\n",
    "NOTE: 8.9 % performance was lost because the PME ranks\n",
    "      had less work to do than the PP ranks.\n",
    "      You might want to decrease the number of PME ranks\n",
    "      or decrease the cut-off and the grid spacing.\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   618674.475     6191.794     9991.8\n",
    "                         1h43:11\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       13.954        1.720\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -n 120 -p TH_NET1 /vol6/software/gromacs506_cpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 5.0 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.7 %\n",
    " Average PME mesh/force load: 0.409\n",
    " Part of the total run time spent waiting due to PP/PME imbalance: 8.9 %\n",
    "\n",
    "NOTE: 8.9 % performance was lost because the PME ranks\n",
    "      had less work to do than the PP ranks.\n",
    "      You might want to decrease the number of PME ranks\n",
    "      or decrease the cut-off and the grid spacing.\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   728371.909     6074.614    11990.4\n",
    "                         1h41:14\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       14.223        1.687\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -N 1 -n 1 -p gpu_test /vol6/home/shuqunliu/bin/gpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   287133.731    24589.113     1167.7\n",
    "                         6h49:49\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:        3.514        6.830\n",
    "\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -N 2 -n 2 -p gpu_test /vol6/home/shuqunliu/bin/gpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 2.5 %\n",
    " Part of the total run time spent waiting due to load imbalance: 1.0 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   193891.557     8102.905     2392.9\n",
    "                         2h15:02\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       10.663        2.251\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -N 3 -n 3 -p gpu_test /vol6/home/shuqunliu/bin/gpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    " Average load imbalance: 0.9 %\n",
    " Part of the total run time spent waiting due to load imbalance: 0.3 %\n",
    " Steps where the load balancing was limited by -rdd, -rcon and/or -dds: X 0 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   210182.125     5849.592     3593.1\n",
    "                         1h37:29\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       14.770        1.625\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -N 4 -n 4 -p gpu_test /vol6/home/shuqunliu/bin/gpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    "```\n",
    "******\n",
    "```\n",
    "yhrun -N 5 -n 5 -p gpu_test /vol6/home/shuqunliu/bin/gpu/bin/gmx_mpi mdrun -v -deffnm md\n",
    "\n",
    " Average load imbalance: 1.2 %\n",
    " Part of the total run time spent waiting due to load imbalance: 0.4 %\n",
    " Steps where the load balancing was limited by -rdd, -rcon and/or -dds: X 0 %\n",
    "\n",
    "\n",
    "               Core t (s)   Wall t (s)        (%)\n",
    "       Time:   225917.647     3793.623     5955.2\n",
    "                         1h03:13\n",
    "                 (ns/day)    (hour/ns)\n",
    "Performance:       22.775        1.054\n",
    "```\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f118dc6c450>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nju72pNgbY1rSeafPeFL8r5I7BWsqplfGneOfjbl+fg4zfuRJLh7v65j/y9uAsBKNtGDnx/8UZopS\nAl9wH9oAAAJCSURBVLn/fz/Js7+7xp9G7r9/XrvJPwXL3eIXERERERERERERERERERERERERERER\nEREREREREREREZEr5OfqAERERNxJX0wVsk2YSl4AU4D/YiqUbQfC7dufAMblee1CTAW287UA/mc/\n5lrMiluBmFW4tmBW4grNc8xvgaXAcsxCCJPtr/sFUzMdoJF920Z7vPWK/lZFREQ8RyNMEs4uj5hd\npvJLcpchrIcpqxgA9CN/kv4OaHveMf0xtY9vtz8uC/gCrwBf2LfdiCkvGYBJ0vvznPtdchdvqGiP\nLwiIAHrbt/thkr6ICKBuOPFO7YE5mPWawazTnG2O/ecuTJ3jmxw85o1AImaFIYDT9p93YRItmMSb\ngFnww8KsDZ197g7AA8C/7I8DgBuANZglEmtiao/vcjAeEbkKKEmLN7JwfLWfLMwykXmXbS1qa7aw\nc50573E3zGIOeW0DfsKs7f098Dyme1xExO3WkxYpDsuAh8nt7q5k/2mzb7dh1uGti2n97gWa2LfX\nAloWcMztmLWSm9sfl8N0d68itxu7AaZ1vI0LE3cMMCDP46b2n3UwywuOA74BbnX0TYqI91NLWrzR\n78A7wAogEzNQ6ylMC3sfsA4oj2m1nsMMBttjf90f5HZp53UOeASTTEsDKcC9mGUNP8UMHMvAXN9O\nt5/LyvP6t4CP7fv5YLraHwR6Ao/bX5Noj1tEROSq8yWmy1lExCOou1tERERERERERERERERERERE\nRERERERERERERERERDzN/wMxLDgc7IuangAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f118dd9f6d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(111)\n",
    "ax2 = ax1.twiny()\n",
    "\n",
    "ax1.set_ylabel(\"ns/day\")\n",
    "\n",
    "cpu_cs = [20, 40, 60, 80, 100, 120]\n",
    "cpu_per = [5.383, 8.282, 10.384, 16.545, 13.954, 14.223]\n",
    "ax1.plot(cpu_cs, cpu_per, 'ro-', label='cpu')\n",
    "my_cpu_cs = [20, 24]\n",
    "my_cpu_per = [3.978, 4.294]\n",
    "ax1.plot(my_cpu_cs, my_cpu_per, 'go-', label='my_cpu')\n",
    "aliyun_cs = [16, 32, 48, 64, 80, 96]\n",
    "aliyun_per = [3.697, 6.294, 7.383, 9.554, 16.324, 13.954]\n",
    "ax1.plot(aliyun_cs, aliyun_per, 'yo-', label='aliyun')\n",
    "ax1.set_xlabel(r\"cpu cores\")\n",
    "ax1.axis([0, 140, 0, 25])\n",
    "ax1.legend(bbox_to_anchor=(1.05, 1), loc=2)\n",
    "\n",
    "gpu_cs = [1, 2, 4, 5]\n",
    "gpu_per = [3.514, 10.663, 14.770, 22.775]\n",
    "ax2.plot(gpu_cs, gpu_per, 'b^-', label='gpu')\n",
    "ax2.axis([0, 6, 0, 25])\n",
    "ax2.set_xlabel(r\"gpu cores\")\n",
    "ax2.legend(bbox_to_anchor=(1.05, 1), loc=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
